home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / bbsutil / bsrc_250.zip / XMSEND.C < prev    next >
C/C++ Source or Header  |  1991-09-15  |  22KB  |  818 lines

  1. /*--------------------------------------------------------------------------*/
  2. /*                                                                          */
  3. /*                                                                          */
  4. /*      ------------         Bit-Bucket Software, Co.                       */
  5. /*      \ 10001101 /         Writers and Distributors of                    */
  6. /*       \ 011110 /          Freely Available<tm> Software.                 */
  7. /*        \ 1011 /                                                          */
  8. /*         ------                                                           */
  9. /*                                                                          */
  10. /*  (C) Copyright 1987-91, Bit Bucket Software Co., a Delaware Corporation. */
  11. /*                                                                          */
  12. /*                                                                          */
  13. /*                  This module was written by Bob Hartman                  */
  14. /*                                                                          */
  15. /*                                                                          */
  16. /*                 BinkleyTerm Xmodem Sender State Machine                  */
  17. /*                                                                          */
  18. /*                                                                          */
  19. /*    For complete  details  of the licensing restrictions, please refer    */
  20. /*    to the License  agreement,  which  is published in its entirety in    */
  21. /*    the MAKEFILE and BT.C, and also contained in the file LICENSE.250.    */
  22. /*                                                                          */
  23. /*    USE  OF THIS FILE IS SUBJECT TO THE  RESTRICTIONS CONTAINED IN THE    */
  24. /*    BINKLEYTERM  LICENSING  AGREEMENT.  IF YOU DO NOT FIND THE TEXT OF    */
  25. /*    THIS  AGREEMENT IN ANY OF THE  AFOREMENTIONED FILES,  OR IF YOU DO    */
  26. /*    NOT HAVE THESE FILES,  YOU  SHOULD  IMMEDIATELY CONTACT BIT BUCKET    */
  27. /*    SOFTWARE CO.  AT ONE OF THE  ADDRESSES  LISTED BELOW.  IN NO EVENT    */
  28. /*    SHOULD YOU  PROCEED TO USE THIS FILE  WITHOUT HAVING  ACCEPTED THE    */
  29. /*    TERMS  OF  THE  BINKLEYTERM  LICENSING  AGREEMENT,  OR  SUCH OTHER    */
  30. /*    AGREEMENT AS YOU ARE ABLE TO REACH WITH BIT BUCKET SOFTWARE, CO.      */
  31. /*                                                                          */
  32. /*                                                                          */
  33. /* You can contact Bit Bucket Software Co. at any one of the following      */
  34. /* addresses:                                                               */
  35. /*                                                                          */
  36. /* Bit Bucket Software Co.        FidoNet  1:104/501, 1:343/491             */
  37. /* P.O. Box 460398                AlterNet 7:491/0                          */
  38. /* Aurora, CO 80046               BBS-Net  86:2030/1                        */
  39. /*                                Internet f491.n343.z1.fidonet.org         */
  40. /*                                                                          */
  41. /* Please feel free to contact us at any time to share your comments about  */
  42. /* our software and/or licensing policies.                                  */
  43. /*                                                                          */
  44. /*--------------------------------------------------------------------------*/
  45.  
  46. /* Include this file before any other includes or defines! */
  47.  
  48. #include "includes.h"
  49.  
  50. void Build_Header_Block (XMARGSP args, char type)
  51. {
  52.     struct FILEINFO dta;
  53.     SEADATAP ttmp;
  54.  
  55.     (void) dfind (&dta, args->filename, 0);
  56.     args->save_header = type;
  57.     ttmp = (SEADATAP) &(args->header);
  58.  
  59.     (void) memset (ttmp, 0, sizeof (XMDATA));
  60.     ttmp->header = type;
  61.     ttmp->block_num = 0;
  62.     ttmp->block_num_comp = 0xff;
  63.     ttmp->filelength = args->filelen;
  64.     (void) strncpy (ttmp->sendingprog, xfer_id, 14);
  65.     if (type == SYN)
  66.         {
  67.         (void) memset (ttmp->filename, ' ', 16);
  68.         ttmp->timedate = dta.time;
  69.         /* This is the CRC bit in the TeLink header */
  70.         ttmp->Resync = 1;
  71.         }
  72.     else
  73.         {
  74.         ttmp->timedate = args->save_filetime.oneword.timedate;
  75.         ttmp->SLO = (unsigned char) (((cur_baud.rate_value >= 9600) && !no_overdrive)? 1 : 0);
  76.         ttmp->Resync = (unsigned char) (no_resync ? 0 : 1);
  77.         ttmp->MACFLOW = 1;
  78.         }
  79.     if (args->temp_name != NULL)
  80.         (void) strncpy (ttmp->filename, args->temp_name, strlen (args->temp_name));
  81.     else
  82.         (void) strncpy (ttmp->filename, (char *) (dta.name), strlen (dta.name));
  83. }
  84.  
  85. void XSSetVars (XMARGSP);
  86. int XSInit (XMARGSP, int);
  87. int XSEnd (XMARGSP, int);
  88. int XSXmtStart (XMARGSP);
  89. int XSXmTeStrt (XMARGSP);
  90. int XSCheckACK (XMARGSP);
  91. int XSSendBlk (XMARGSP);
  92. int XSWaitEnd (XMARGSP);
  93.  
  94. STATES Xmodem_Sender[] = {
  95.    { "XSInit", XSInit },
  96.    { "XSEnd",  XSEnd },
  97.    { "XS0",    XSXmtStart },
  98.    { "XS0T",   XSXmTeStrt },
  99.    { "XS1",    XSCheckACK },
  100.    { "XS2",    XSSendBlk },
  101.    { "XS3",    XSWaitEnd }
  102. };
  103.  
  104. int XSInit (XMARGSP args, int start_state)
  105. {
  106.     struct stat st;
  107.     char junkbuff[100];
  108.  
  109.     /* Get the file information */
  110.     if (stat (args->filename, &st))
  111.         {
  112.         /* Print error message */
  113.         return (OPEN_ERR);
  114.         }
  115.  
  116.     if ((args->file_pointer = share_fopen (args->filename, "rb", DENY_WRITE)) == NULL)
  117.         {
  118.         /* Print error message */
  119.         return (OPEN_ERR);
  120.         }
  121.  
  122.     /* Get important information out of it */
  123.     args->filelen = st.st_size;
  124.     args->LastBlk = (st.st_size + 127) / 128;
  125.     args->save_filetime.oneword.timedate = st.st_atime;
  126.     args->prev_bytes = 0L;
  127.     args->tot_errs = 0;
  128.  
  129.     (void) sprintf (junkbuff, MSG_TXT(M_SEND_MSG), args->LastBlk, args->filename, st.st_size);
  130.     if (un_attended && fullscreen)
  131.         {
  132.         clear_filetransfer ();
  133.         sb_move (file_hWnd, 1, 2);
  134.         FlLnModeSet( FILE_LN_2, 1 );
  135.         sb_puts( GetDlgItem( file_hWnd, FILE_LN_1 ), junkbuff );
  136.         elapse_time ();
  137.         sb_show ();
  138.         }
  139.     else
  140.        {
  141.        status_line ("+%s", junkbuff);
  142.        (void) printf ("\n");
  143.        }
  144.  
  145.     locate_y = wherey ();
  146.     locate_x = wherex ();
  147.  
  148.     /* Start the throughput calculations */
  149.     throughput (0, 0L);
  150.     return (start_state);
  151. }
  152.  
  153. int XSEnd (XMARGSP args, int cur_state)
  154. {
  155.     args->result = cur_state;
  156.  
  157.     /* Close file */
  158.     (void) fclose (args->file_pointer);
  159.  
  160.     if (args->tot_errs > 3)
  161.         status_line (MSG_TXT(M_CORRECTED_ERRORS), args->tot_errs, args->LastBlk);
  162.  
  163.     /* Log that we sent it */
  164.     if (cur_state == SUCCESS)
  165.         {
  166.         throughput (1, (unsigned long) (args->filelen - args->prev_bytes));
  167.         status_line ("%s: %s", MSG_TXT(M_FILE_SENT), args->filename);
  168.         update_files (1);
  169.         }
  170.  
  171.     return (cur_state);
  172. }
  173.  
  174. void XSSetVars (XMARGSP args)
  175. {
  176.     if (no_sealink)
  177.         {
  178.         args->options.SLO = 0;
  179.         args->options.Resync = 0;
  180.         }
  181.     else
  182.         {
  183.         args->options.SLO = ((cur_baud.rate_value >= 9600) && !no_overdrive) ? 1 : 0;
  184.         args->options.Resync = (~no_resync) & 1;
  185.         }
  186.  
  187.     args->options.SEAlink = 0;
  188.     args->SendBLK = 1;
  189.     args->curr_byte = 0L;
  190.     args->NextBLK = 1;
  191.     args->ACKST = 0;
  192.     args->ACKBLK = -1L;
  193.     args->Window = 1;
  194.     args->ACKsRcvd = 0;
  195.     args->NumNAK = 0;
  196.     args->T1 = timerset (3000);
  197. }
  198.  
  199. int XSXmtStart (XMARGSP args)
  200. {
  201.     XSSetVars (args);
  202.     Build_Header_Block (args, SOH);
  203.     return (XS1);
  204. }
  205.  
  206. int XSXmTeStrt (XMARGSP args)
  207. {
  208.     XSSetVars (args);
  209.     Build_Header_Block (args, SYN);
  210.     return (XS1);
  211. }
  212.  
  213. int XSCheckACK (XMARGSP args)
  214. {
  215.     Check_ACKNAK (args);
  216.     return (XS2);
  217. }
  218.  
  219. int XSSendBlk (XMARGSP args)
  220. {
  221.     if (!CARRIER)
  222.         return (CARRIER_ERR);
  223.  
  224.     if (got_ESC ())
  225.         {
  226.         status_line (MSG_TXT(M_KBD_MSG));
  227.         return (KBD_ERR);
  228.         }
  229.  
  230.     if ((args->NumNAK > 4) &&